package com.linkgie.galaxyframework.log;

import java.util.Iterator;

public interface ApplicationLogQuery {

	/**
	 * 查找指定领域的日志；
	 * <p>
	 * 
	 * 注：只包含 14 天以内的日志；
	 * 
	 * @param domain
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast2Weeks() {
		// 14天之前；
		long twoWeekAgo = System.currentTimeMillis() - 14 * 24 * 3600 * 1000L;
		return findLogs(null, null, twoWeekAgo);
	}


	/**
	 * 查找指定领域的日志；
	 * <p>
	 * 
	 * 注：只包含 14 天以内的日志；
	 * 
	 * @param domain
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast2Weeks(String domain) {
		// 14天之前；
		long twoWeekAgo = System.currentTimeMillis() - 14 * 24 * 3600 * 1000L;
		return findLogs(null, domain, twoWeekAgo);
	}

	default Iterator<LogMessage> findLogsOfLast2Weeks(Class<?> type, String domain) {
		// 14天之前；
		long twoWeekAgo = System.currentTimeMillis() - 14 * 24 * 3600 * 1000L;
		return findLogs(type, domain, twoWeekAgo);
	}


	/**
	 * 查找指定领域的日志；
	 * <p>
	 * 
	 * 注：只包含 14 天以内的日志；
	 * 
	 * @param domain
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast3Days() {
		// 3天之前；
		long threeDaysAgo = System.currentTimeMillis() - 3 * 24 * 3600 * 1000L;
		return findLogs(null, null, threeDaysAgo);
	}


	/**
	 * 查找指定领域的日志；
	 * <p>
	 * 
	 * 注：只包含 3 天以内的日志；
	 * 
	 * @param domain
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast3Days(String domain) {
		// 3天之前；
		long threeDaysAgo = System.currentTimeMillis() - 3 * 24 * 3600 * 1000L;
		return findLogs(null, domain, threeDaysAgo);
	}


	default Iterator<LogMessage> findLogsOfLast3Days(Class<?> type, String domain) {
		// 3天之前；
		long threeDaysAgo = System.currentTimeMillis() - 3 * 24 * 3600 * 1000L;
		return findLogs(type, domain, threeDaysAgo);
	}

	/**
	 * 查找日志；
	 * 
	 * @param source
	 * @param domain
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogs(Class<?> source, String domain, long fromTime) {
		return findLogs(source, null, null, domain, fromTime, null, null);
	}

	/**
	 * 查找日志；
	 * 
	 * @param level  日志级别；
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogs(LogLevel level, long fromTime) {
		return findLogs(null, null, level, null, fromTime, null, null);
	}

	/**
	 * 查找日志；
	 * 
	 * @param messagePattern
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogs(String messagePattern, long fromTime) {
		return findLogs(null, messagePattern, null, null, fromTime, null, null);
	}

	/**
	 * 查找日志；
	 * 
	 * @param domain
	 * @param type
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	/**
	 * @param source         来源类型；
	 * @param messagePattern 日志内容
	 * @param level          日志级别
	 * @param domain         业务领域
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast2Weeks(Class<?> source, String messagePattern, LogLevel level,
			String domain,LogPhase phase, Boolean success) {
		return findLogsOfLast2Weeks(messagePattern, level, domain, source == null ? null : source.getName(), phase, success);
	}

	/**
	 * 查找日志；
	 * 
	 * @param domain
	 * @param type
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast2Weeks(String messagePattern, LogLevel level, String domain,
			String type,LogPhase phase, Boolean success) {
		// 14天之前；
		long twoWeekAgo = System.currentTimeMillis() - 14 * 24 * 3600 * 1000L;
		return findLogs(messagePattern, level, domain, type, twoWeekAgo, phase, success);
	}

	/**
	 * 查找日志；
	 * 
	 * @param domain
	 * @param type
	 * @param fromTime 最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogsOfLast3Days(String messagePattern, LogLevel level, String domain,
			String type,LogPhase phase, Boolean success) {
		// 3天之前；
		long threeDaysAgo = System.currentTimeMillis() - 3 * 24 * 3600 * 1000L;
		return findLogs(messagePattern, level, domain, type, threeDaysAgo, phase, success);
	}

	/**
	 * 查找日志；
	 * 
	 * @param source         来源类型；
	 * @param messagePattern 日志内容
	 * @param level          日志级别
	 * @param domain         业务领域
	 * @param fromTime       最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	default Iterator<LogMessage> findLogs(Class<?> source, String messagePattern, LogLevel level, String domain,
			long fromTime, LogPhase phase, Boolean success) {
		return findLogs(messagePattern, level, domain, source == null ? null : source.getName(), fromTime, phase, success);
	}

	/**
	 * 查找日志；
	 * 
	 * @param messagePattern 日志内容
	 * @param level          日志级别
	 * @param domain         业务领域
	 * @param sourcePattern         来源类型；
	 * @param fromTime       最远时间；返回指定时间之后的全部日志；
	 * @return
	 */
	Iterator<LogMessage> findLogs(String messagePattern, LogLevel level, String domain, String sourcePattern, long fromTime, LogPhase phase,  Boolean success);

}
